import xlrd
import requests
import time
import shutil
# import threadpool
import os
import json
import re
import xlwt
from xlutils.copy import copy

#引入自定义文件中的内容
import write_to_excel

app_link='app_link.txt' #先定义一个文本，存储xlsx文件路径，一行一个路径

#将获取的whois信息存入excel表格
def json_to_xlsx(id,response,newsheet):#id:查询到第几个域名信息（表格中的序号）,json:json字典(responese)，newsheet:传入表名句柄，用来定位具体填入那个sheet中
    #设置表头信息
    title=["StateCode","Reason","Host","ContactPerson","Registrar","Email","Phone","CreationDate","ExpirationDate","WhoisServer","DnsServer","DomainStatus"]
    #将表头信息填入excel表中，这里是从第10列开始，预留前面的位置
    for i in range(len(title)):
        newsheet.write(0,i+10,title[i])#使用传入的句柄定位后写入三个参数分别为：第几行，第几列，写入的内容
    #遍历传入的JSON字典，逐项（key,value）遍历
    for line in response:
        #返回的json一共三个key（StateCode，Reason，Result）
        #下面对Result进行在遍历，因为Result本身又是一个字典，包含了多个信息
        if (line == "Result"):
            if response[line]==None:
                continue
            Result = response[line]
            i = 12  # 从第12列开始
            for key in Result:
                # 使用if判断的原因：如果None值被多次赋值，会出现TypeError: 'NoneType' object is not iterable。这里可以考虑使用try catch进行lazy绕过
                if key==None:
                    continue
                else:
                    newsheet.write(id,i,Result[key])#根据传入的id写入对应的行以及列
                    i += 1 #列数自增，逐步向后填入读取的内容
        #         print(type(Result))
        #下面同理
        elif (line == "StateCode"):
            newsheet.write(id, 10, response[line])
        else :
            newsheet.write(id, 11, response[line])

#将json直接传入文本文档中，
def json_to_txt(sheet,Chinese_name,url_name,response):#传入表名，APP中文名称，待查链接，响应信息
    file_name = sheet + str(time.time()) + ".json"  # 创建对应的json文档，为避免重复使用当前时间进行填充
    f = open(file_name, 'w')
    context="\n"+"仿冒APP名称： "+Chinese_name+"  所查域名： "+url_name+":"+"\n"+str(response).replace(',','\n')
    # context = "\n" + "仿冒APP名称： " + Chinese_name + "  所查域名： " + url_name + ":" + "\n" + str(response)
    context=response
    f.write(context)
    json.dump(response,f)#将得到的json格式的内容写入文档
    f.close()

#whois查询主要调用方法
def whois_detector(applink):
    #从文档中读取要查询的.xlsx和.xls文件路径
    file_path=open(app_link,encoding='utf-8')
    #逐行读取文件路径
    # lines = file_path.readlines()
    lines=write_to_excel.open_app_link(app_link)
    for line in lines:
        #处理文件路径，包括更换分隔符等
        ############################################使用外置文件处理查询文件
        # line=line.strip('\n')
        # line = eval(repr(line).replace('\\', '/'))
        #############################################
        strip_line=line.split('/')[-1]

        print("查询文件为："+line)
        workbook = xlrd.open_workbook(line)#获得excel表格文件句柄
        newworkbook=copy(workbook)#复制文件句柄，为了在已有的excel表中写入数据
        sheet_list = []  #定义文档中的sheet表列表
        sheet_list = workbook.sheet_names()  # 获取所有的表名
        sheet_index=0 #定义表索引,方便查找表并将内容写入已有表，从零开始
        for sheet in sheet_list:  # 逐个表进行whois查询  ，这里可以使用open_excel_and_sheet返回sheet_list
            #sheet应该可以直接将内容进行写入
            sheet_single = workbook.sheet_by_name(sheet)  # 通过表名获取内容
            rows = sheet_single.nrows#行数
            cols = sheet_single.ncols#列数
            for col in range(1, rows ):  # 遍历指定表的所有有效行，左闭右开
                Chinese_name = sheet_single.cell_value(col, 1)  # 获得中文名称
                url_name = sheet_single.cell_value(col, 2)  # 获得对应的域名
                id=sheet_single.cell_value(col,0)#获取对应的id号
            ####使用云API进行查询
                if url_name=="":#部分数据的域名部分为空
                    continue
                url = "https://apidatav2.chinaz.com/single/whois"  # 接口地址，使用ChinaZ的云API
                query = {
                    "key": "b61891e4dfa6476b85ce1bad4d6234b6",
                    "domain": url_name
                }  # 构造参数 api对接口有自动提取域名的功能，使用统一apikey，无IP锁定
                response = requests.request("GET", url, params=query).json()#返回相关信息
                ##将相应的json消息传入excel表格中
                newsheet=newworkbook.get_sheet(sheet_index)  #使用复制后的句柄通过sheet_index索引获得具体表，并创建表句柄
                json_to_xlsx(id,response,newsheet)  #将相关信息传入方法，方法将信息填入当前表中
                # result_file=str(strip_line)+str(time.time())+".xls"
                # newworkbook.save('ok.xlsx')
                # newworkbook.save(result_file)
                # json_to_txt(sheet,Chinese_name,url_name,response)  #将结果存入文本文档中
                time.sleep(0.5)#使用单一查询，考虑使用一定时间（50ms）的延时，防止查询无法及时响应
            #这里将索引的增加添加到对sheet_list的遍历中，否则只能遍历一个表格
            sheet_index+=1#索引加1，查找并遍历下一个表
    newworkbook.save(strip_line+".xls")#遍历并所有表并填写相关信息后，另存文件，完成一个xlsx或者xls的查询和写入
    file_path.close()

if __name__=='__main__':
    whois_detector()